package kanolaag;

public class Trit {

	private byte bytes[];
	private int i = 0;
	private int j = 3;

	
	/**
	 * Maakt van een int, 3 bytes, en Maakt daar 16 trits van.
	 * @require b < 2^24 - 1
	 * @param b de int die omgezet moet worden naar trits.
	 */
	public Trit(int b) {
		int x = 3, y = 0;
		byte temp[] = new byte[4];
		while (b != 0) {
			int mod = b % 3;
			temp[x] = (byte) (mod << (y * 2) | temp[x]);
			y++;
			if (y > 3) {
				x--;
				y = 0;
			}
			b = b / 3;
		}
		Trit tempTrit = new Trit(temp);
		temp = new byte[4];
		x = 0; y = 3;
		int prev = -1;
		while(tempTrit.hasNext()) {
			int t = tempTrit.next();
			if(prev == t) {
				t = 3;
			}
			temp[x] = (byte) (t << (y * 2) | temp[x]);
			y--;
			if (y < 0) {
				x++;
				y = 3;
			}
			prev = t;
		}
		this.bytes = temp;
	}
	
	private Trit(byte bytes[]) {
		this.bytes = bytes;
	}

	/**
	 * Zijn er al 16 Trits uit het object getrokken?
	 * @return true als er nog Trits uitgetrokken kunnen worden, en false wanneer er al 16 uit zijn gehaald.
	 */
	public boolean hasNext() {
		return i < bytes.length;
	}

	private static final byte r = (byte) (0x03);
	
	/**
	 * Geeft de volgende Trit terug.
	 * @return de volgende Trit
	 */
	public byte next() {
		byte result = (byte) (bytes[i] >> j * 2);
		result = (byte) (result & r);
		j--;
		if (j < 0) {
			j = 3;
			i++;
		}
		return result;
	}
}
